<html xmlns="http://www.w3.org/1999/xhtml" id="data-structures">
<head>
    <title>データ、XML と XPath</title>
 <othercredit role="translator">
  <firstname></firstname>
  <surname>TOG</surname>
  <contrib>2006/05/15　Wiki版</contrib>
  <url>http://laszlo.jp/modules/bwiki/index.php?LaszloDocuments%2F%A5%C7%A1%BC%A5%BF%A4%C8%A5%C7%A1%BC%A5%BF%A5%D0%A5%A4%A5%F3%A5%C7%A5%A3%A5%F3%A5%B0%2F%A5%C7%A1%BC%A5%BF%A1%A2XML%A4%C8XPath</url>
 </othercredit>
 <othercredit role="translator">
  <firstname></firstname>
  <surname>kmine</surname>
  <contrib>2006/10/29　3.1対応。HTML化。</contrib>
 </othercredit>
</head>

<body>

<h1>データ、XML と XPath</h1>


<p>
<dfn>データ (data)</dfn> という用語は、 Laszlo アプリケーションで表示したり操作したりできる形での数、文字、テキストのどれかを指します。 Laszlo アプリケーションでデータがとる特定の形式は XML 文書 (あるいはフラグメント) か Javascript オブジェクトのどちらかです。この章では <dfn>XML</dfn> および関連する <dfn>XPath 文法</dfn> の簡単な紹介をします。 Javascript オブジェクトについては、 <xref linkend="language-preliminaries">LZX言語の基礎知識</xref> のオブジェクトのセクションで扱います。
</p>

<h2>LZXでのデータの扱い</h2>
<p>
LZXはデータの出力や、データとユーザインタフェースとの連携を容易にするよう設計されており、特に以下の機能を提供している。
</p>
<ul>
    <li>アプリケーションへの直接データ埋め込み (<a href="#datasets">Datasets</a> 参照)</li>
    <li>実行時におけるリモートデータソースとのデータ送受信 (<a href="#datasets">Datasets</a> 参照)</li>
    <li>Webサービスとのデータ送受信 (<xref linkend="databinding">Web services</xref> 参照)</li>
    <li>実行時におけるデータ作成と処理 (<xref linkend="databinding">Data access and binding</xref> 参照)</li>
    <li>スクリプトと同じように、ユーザインターフェイスへの宣言的なデータの<i>結合 (バインディング、binding)</i> (<xref linkend="databinding">Data access</xref> 参照)</li> 
</ul>

<p>
OpenLaszloアプリケーションにおけるデータバインディングや処理についての丁寧な紹介については、 <a href="${tutorials}data-tutorial.html">チュートリアル</a> から始めたほうが良いかもしれない。
</p>

<h2>XML とは？</h2>

<p>このドキュメントを読んでるのであれば、XMLについて何らかの知識を持っているだろう。簡単に言えば、XMLとは構造化されたデータを表現するためのマークアップ言語である。XMLのシンタックスはとてもよく定義されており、これにより非常に多くのシステムがXMLとしてエンコードされたデータを理解することができる。  (LZX 自身も実際にはXMLのアプリケーションである [参照 <xref linkend="language-preliminaries"/>]).
</p>

<p>
もしあなたが XML の
<glossterm>ドキュメント (document)</glossterm>, <glossterm>要素 (element)</glossterm>, 
<glossterm>属性 (attribute)</glossterm> といった言葉を知らないのであれば、以下の紹介や書籍のひとつを読んだほうが良いかもしれない。</p>

<ul>
  <li><a target="_blank" href="http://www.w3schools.com/xml/xml_whatis.asp">W3 Schools: Introduction to XML</a></li>
  <li><a target="_blank" href="http://www.xml.com/pub/a/98/10/guide0.html">XML.com: A Technical introduction to XML</a></li>
</ul>

<p>一般的にXMLドキュメントは、 <dfn>「要素」element</dfn> と呼ばれるツリー中のノードや、それぞれのノードに関連付けられたデータである <dfn>「属性」attribute</dfn> により階層構造をとっている。以下はXMLドキュメントのサンプルである。</p>

<example title="XML ドキュメント" extract="false">
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
&lt;bookshelf&gt;
  &lt;book binding="paperback"&gt;
    &lt;title&gt;Acts of the Apostles&lt;/title&gt;
    &lt;author&gt;John F.X. Sundman&lt;/author&gt;
    &lt;publisher&gt;Rosalita Associates&lt;/publisher&gt;
    &lt;price&gt;15.00&lt;/price&gt;
    &lt;year&gt;1999&lt;/year&gt;
    &lt;category&gt;thriller&lt;/category&gt;
    &lt;rating&gt;4.5&lt;/rating&gt;
  &lt;/book&gt;
  &lt;book binding="casebound"&gt;
    &lt;title&gt;Shock&lt;/title&gt;
    &lt;author&gt;Robin Cook&lt;/author&gt;
    &lt;publisher&gt;Putnam&lt;/publisher&gt;
    &lt;price&gt;24.95&lt;/price&gt;
    &lt;year&gt;2001&lt;/year&gt;
    &lt;category&gt;thriller&lt;/category&gt;
    &lt;rating&gt;3.5&lt;/rating&gt;
  &lt;/book&gt;
  &lt;book binding="paperback"&gt;
    &lt;title&gt;Cheap Complex Devices&lt;/title&gt;
    &lt;editor&gt;John Compton Sundman&lt;/editor&gt;
    &lt;publisher&gt;Rosalita Associates&lt;/publisher&gt;
    &lt;price&gt;11.00&lt;/price&gt;
    &lt;year&gt;2002&lt;/year&gt;
    &lt;category&gt;metafiction&lt;/category&gt;
    &lt;rating&gt;5.0&lt;/rating&gt;
  &lt;/book&gt;
&lt;/bookshelf&gt;  
</example>

<p>全てのXMLドキュメントと同様に、一番外側に一つドキュメントルート要素 (<dfn>document root element</dfn>) を持ちます : <tagname
link="false">bookshelf</tagname>。このルート要素の下には3つの子要素  <tagname link="false">book</tagname> があり、<code>"binding"</code> という唯一の <glossterm>属性</glossterm> を持ちます。
さらに <code>&lt;book&gt;</code> の中には他にも要素があります。一般的にXMLドキュメントは任意の深さを持つことができ、要素と属性の構造は非常に柔軟です。</p>

<p>さらに詳細は <a target="_blank"
href="http://www.w3.org/XML/">W3C のウェブサイト</a> の XML 仕様自体を参照してください。Laszlo は以下を例外として XML 1.0 の全仕様をサポートします。</p>

<ul>
  <li>名前空間の限定サポート。 XML ドキュメントが解析されるときに名前空間は取り除かれる。</li>
  <li>文字集合の限定サポート。 (XML ファイルの宣言文字集合に関係なく、Microsoft Windows の
  <a target="_blank" href="http://www.microsoft.com/typography/unicode/1252.htm">Cp1252</a> 文字集合から 8ビット文字のみサポート。)</li>
  <li>外部の実体宣言に対するサポートなし。</li>
  <li>データサイズに関する制限。要素のテキストコンテントは最大 64 KBytes、属性と要素名を結合したものは最大 64KBytes に制限。</li>
</ul>
<h3>空白</h3>
<p>「空白 (whitespace)」(スペース、タブ、ラインフィード (linefeed)、キャリッジリターン (carriage return)) の処理は、XML が明確なデータ交換フォーマットとして問題となる理由の一つです。というのは、空白をどう扱うかについてアプリケーションが異なる仮定をおくからです。 OpenLaszlo アプリケーションでは、プロキシと SOLO のアプリケーションで空白に異なる処理を行うため、この問題は複雑です。</p>
<p>
OpenLaszlo アプリケーションでは、ランタイムでは空白をトリムしません。というより、 <em>全て</em> 空白のテキストノードは完全に削除します。例えば</p>
<pre>
&lt;foo&gt;
&lt;bar/&gt;

&lt;/foo&gt;
</pre>
<p>
には全て空白のテキストノードが &lt;bar&gt; タグの前後 2 つあります。
</p><p>
これは、プログラムは一般に空白ノード全部を取っておこうとはしていないためであり、その上 SOLO アプリケーションで用いられるクライアント XML パーサは適合しないデータを処理できないからです。でも全て空白のテキストコンテントを持てない、というわけではありません。代わりに全くノードを持ちませんが、ある場合には本当に正しいものではありません。 </p><p>
ここで示した問題は、空白の処理がトリッキーになりえて、データが期待通りに表示されないのなら (特に同じプログラムのプロキシと SOLO での実装で振るまいが違う場合には)、 慎重に注意を払うべきである、ということです。
</p>
<h2>XPath</h2>

<p>
LZX データのアクセスとバインディングには、XML 文書の一部を識別するための W3C <a target="_blank" href="http://www.w3.org/TR/xpath">XPath</a> 標準を主に使っています。 LZX は XPath のサブセットをサポートします。 LZX でサポートされている XPath 式の全リストは <a href="#xpathnodes">後ろのセクションの表</a> にあります。</p>

<p>
XML 文書はツリー構造をとっているため、XPath は基本的にツリーノードを識別する文法規則の集まりです。 XPath の規則はパス記法 (path notation) に基づいていて、これが名前になっています。 XPath は式とデータを操作する関数のライブラリです。例えば、 <code>name()</code> という関数はノードの名前を返し、 <code>text()</code> はテキストコンテントを返します。XPath は XML 文書のパターンにマッチするのにとても適したパターンマッチ言語として使われています。
</p>

<p>
XPath の記法は、近年のオペレーティングシステムでファイルを識別するのに用いられる記法と似ています。パスは相対的にでも絶対的にでも使えます。絶対パスは最上位ノード (ルート) から開始し、スラッシュ文字 (<code>/</code>) で始まります。近傍のノードとの関係を表すのには系図の言葉が使われています。例えばノードは親 (parent)、祖父母 (grandparent)、子 (children)、孫 (grandchildren)、兄弟 (sibling) を持ちます。
</p>

<p>
スラッシュ <code>/</code> は子から親を分けるのに使います。上の XML 文書の例を考えてみてください。 XPath 式 <code>/bookshelf/book</code> は全ての book 要素を選択します。 XPath 式 <code>/bookshelf/book/title</code> は全ての title 要素を選択する、といった具合です。</p>

<p>
要素を指定するには鍵括弧を使います。例えば XPath 式 <code>/bookshelf/book[1]</code> は最初の book 要素を選択します。 </p>
<p>
<code>@</code> 文字は XML 属性を指す簡略形です。だから <code>/bookshelf/book[@price]</code> は price 属性を持つ全ての book を選択します。</p>
<p>XPath 式 <code>/bookshelf/book[@binding='paperback']</code> は paperback 属性値を持つ book ノードを選択します。 </p>
<p> XPath 式 <code>/bookshelf/book[@price]/@price</code> は price 属性を持つ book 全ての price 値を選択します。 </p>
<p>
XPath を使うのに必要な概念は少なく単純で、その記法は簡単です。それでも XPath 関数を使うことで、 XML ノードにずっと洗練されたテストを行うことができます。 </p>
<p>
この文法／パターンマッチング言語の全パワーを見るには、プログラム例、例えば XSLT で書かれたものなどを見るのがいいです。 XPath 仕様はオンラインで http://www.w3.org/TR/xpath にあります。
</p>
<p>
強力なデータバインディングやデータ操作を提供するために LZX で XPath をどう使うかは、 <xref linkend="databinding"/> を見てください。</p>
<h3>サポートしている XPath の機能</h3>
<p>XPath は大規模な仕様で、 LZX は完全ではないけどその多くを実装しています。</p>
<p><a name="xpathnodes"></a>次の表に OpenLaszlo 3.1 で実装している XPath の機能を示します。</p>


<table border="0" cellspacing="0" cellpadding="4" width="100%" title="Supported XPath Funtionality">
    <tr bgcolor="#DEE1F5">
        <td bgcolor="#DEE1F5"><span class="regular">例</span></td>
        <td><span class="regular">意味</span></td>
        <td><span class="regular">In this case</span></td>
    </tr>
    <tr valign="top">
        <td><pre class="code">myData:/myXML[1]/person<span class="redText">[1]</span></pre>
        </td>
        <td><span class="regular">最初の &quot;person&quot; ノード</span></td>
        <td><span class="regular">Homer</span></td>
    </tr>
    <tr valign="top">
        <td><pre class="code">myData:/myXML[1]/person</pre>
        </td>
        <td><span class="regular">&quot;person&quot; ノード全て</span></td>
        <td><span class="regular">Homer, Marge, Montgomery</span></td>
    </tr>
    <tr valign="top">
        <td><pre class="code">myData:/myXML[1]/person<span class="redText">[2-3]</span></pre>
        </td>
        <td><span class="regular">2 番目から 3 番目の &quot;person&quot; ノード</span></td>
        <td><span class="regular">Marge, Montgomery</span></td>
    </tr>
    <tr valign="top">
        <td><pre class="code">myData:/myXML[1]/person<span class="redText">[2-]</span></pre>
        </td>
        <td><span class="regular">2 番目以降の &quot;person&quot; ノード</span></td>
        <td><span class="regular">Marge, Montgomery</span></td>
    </tr>
    <tr valign="top">
        <td><pre class="code">myData:/myXML[1]/person<span class="redText">[-2]</span></pre>
        </td>
        <td><span class="regular">2 番目までの &quot;person&quot; ノード (2 番目含む)</span></td>
        <td><span class="regular">Homer, Marge</span></td>
    </tr>
    <tr valign="top">
      <td><pre class="code">myData:/myXML[1]/person<span class="redText">[@show]</span></pre>
      </td>
      <td><span class="regular"> &quot;show&quot; 属性を持つ全ての &quot;person&quot; ノード</span></td>
      <td><span class="regular">Homer, Marge, Montgomery</span></td>
    </tr>
    <tr valign="top">
      <td><pre class="code">myData:/myXML[1]/person<span class="redText">[@show = 'simpsons']</span></pre>
      </td>
      <td><span class="regular"> &quot;Simpsons&quot; に等しい (比較は大文字小文字区別あり) &quot;show&quot; 属性を持つ全ての &quot;person&quot; ノード</span></td>
      <td><span class="regular">Homer, Marge, Montgomery</span></td>
    </tr>
    <tr valign="top">
      <td><pre class="code">myData:/myXML/*/firstname</pre>
      </td>
      <td><span class="regular">&quot;myXML&quot; の任意の子ノードの全ての &quot;firstname&quot; ノード</span></td>
      <td><span class="regular">Homer, Marge, Montgomery</span></td>
    </tr>
    <tr valign="top" bgcolor="#DEE1F5">
      <td>属性と関数</td>
      <td></td>
      <td></td>
    </tr>
    <tr valign="top">
      <td><pre class="code">myData:/myXML[1]/person[1]<span class="redText">/@show</span></pre>
      </td>
      <td><span class="regular">最初の &quot;person&quot; ノードの &quot;show&quot; 属性</span></td>
      <td>simpsons</td>
    </tr>
    <tr valign="top">
      <td><pre class="code">myData:/myXML[1]/person[1]<span class="redText">/lastname/text()</span></pre>
      </td>
      <td><span class="regular">最初の &quot;person&quot; ノードの &quot;lastname&quot; ノードのテキスト</span></td>
      <td>Simpson</td>
    </tr>
    <tr valign="top">
      <td><pre class="code">myData:/myXML[1]/person[1]<span class="redText">/last()</span></pre>
      </td>
      <td><span class="regular">&quot;person&quot; ノードの数</span></td>
      <td>3</td>
    </tr>
    <tr valign="top">
      <td><pre class="code">myData:/myXML[1]/person[1]<span class="redText">/position()</span></pre>
      </td>
      <td><span class="regular">複製ビューで使ったとき、セット内のビューの位置を示す</span></td>
      <td>n/a</td>
    </tr>
</table>

<h3>XPath のドキュメント</h3>
<p>
XPath は、 XML 文書を他の XML 文書に変換したりブラウザで使われたりする言語である XSLT でよく用いられています。ちゃんとした XSLT 文書は XPath のよいドキュメントです。次のオンラインドキュメントが役に立つでしょう。
</p>
<ul>
    <li><a target="_blank" href="http://www.w3schools.com/xpath/default.asp">W3 Schools: XPath Tutorial</a></li>
    <li><a target="_blank" href="http://www.oreilly.com/catalog/xmlnut/chapter/ch09.html">XML in a Nutshell A Desktop Quick Reference, Chapter 9. XPath </a></li>
</ul>




</body>
</html>
<!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
* Copyright 2001-2004 Laszlo Systems, Inc.  All Rights Reserved.              *
* Use is subject to license terms.                                            *
* X_LZ_COPYRIGHT_END ****************************************************** -->
